package JavaSE.CODE.javaNet.Chat;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServerDemo {
    public static void main(String[] args) {
        ServerSocket serverSocket=null;
        Socket socket=null;
        InputStream inputStream=null;
        ByteArrayOutputStream baos=null;


        try {
            //1、我得有一个地址：套接字方法
            serverSocket = new ServerSocket(9999);
            //2、等待客户端连接过来 accept:服务端侦听方法，返回一个Socket对象
            while (true) {
                socket = serverSocket.accept();

                //3、读取客户端的消息
                inputStream = socket.getInputStream();
                //每一条消息，都需要客户端发送，服务器接收，所以两个Stream都需要，而从内存写到硬盘，或者从硬盘读到内存，实际上都只有内存在起作用，只需要一个流。而复制的话，则是内存自己发挥两种作用。
                //客户端到服务器则不同，每一条消息都是一发一收，所以需要两个流

                //已经接收到消息了，给它输出出来
            /*
            byte[] buffer = new byte[1024];
            int len;
            while((len = inputStream.read(buffer))>0){
                //System.out.println(new String(buffer, 0, len));
                //竟然没乱码，深究socket.getOutputStream();socket.getInputStream()
            }
            */
                //这个流有点不懂？？？
                baos = new ByteArrayOutputStream();
                byte[] buffer = new byte[1024];
                int len;
                while ((len = inputStream.read(buffer)) > 0) {
                    baos.write(buffer, 0, len);
                }
                System.out.println(baos);


            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭资源，从下往上关
            if(baos!=null){
                try {
                    baos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }//以下省略if
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                serverSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
}
